MongoDB 副本集搭建

.MongoDB 副本集(repl set)介绍

        早期版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主

        目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主

        在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据

        再此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server

2.副本集架构图

01

02

03

3.MongoDB副本集搭建

        三台机器: 192.168.0.77(primary) 192.168.0.76(secondary) 192.168.0.75(secondary)

        编辑三台机器的配置文件

1
[root@primary ~]# vim /etc/mongod.conf

        增加:

1
2
3
4
5
replication:
##oplog大小
oplogSizeMB: 20
##复制集名称
replSetName: yanyi

04

05

        分别重启三台机器

        连接主,在主上运行命令mongo

1
2
3
4
5
> use admin
> config={_id:"yanyi",members:[{_id:0,host:"192.168.0.77:27017"},{_id:1,host:"192.168.0.76:27017"},{_id:2,host:"192.168.0.75:27017"}]}
> rs.initiate(config)
> rs.add("192.168.0.76")
> rs.add("192.168.0.75")

        rs.status() //查看状态

        如果两个从上的状态为”stateStr” : “STARTUP”, 则需要进行如下操作

1
2
> var config={_id:"yanyi",members:[{_id:0,host:"192.168.0.77:27017"},{_id:1,host:"192.168.0.76:27017"},{_id:2,host:"192.168.0.75:27017"}]}
>rs.reconfig(config)

        此时再次查看rs.status()会发现从的状态变为SECONDARY

4.MongoDB 副本集测试

        主上建库,建集合

1
2
yanyi:PRIMARY> use mydb
yanyi:PRIMARY> db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
1
yanyi:PRIMARY> show dbs

06

        从上查看

07

        若出现错误Error: listDatabases failed:{ “note” : “from execCommand”, “ok” : 0, “errmsg” : “not master” },需要执行

1
yanyi:SECONDARY> rs.slaveOk()

08

5.MongoDB副本集更改权重模拟主宕机

        默认三台机器权重都为1,如果任何一个权重设置为比其他的高,则该台机器马上切换为primary角色,所以我们预设三台机器的权重分别为:77:3,76:2,75:1

        在主上执行

1
2
3
4
yanyi:PRIMARY> cfg = rs.conf()
yanyi:PRIMARY> cfg.members[0].priority = 3
yanyi:PRIMARY> cfg.members[1].priority = 2
yanyi:PRIMARY> cfg.members[2].priority = 1

09

1
yanyi:PRIMARY> rs.reconfig(cfg)

10

        这样的话,第二个节点将会成为候选主节点。

        主上执行 iptables -I INPUT -p tcp –dport 27017 -j DROP

1
[root@primary ~]# iptables -I INPUT -p tcp --dport 27017 -j DROP